package com.ms.str;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 引用增加到集合里面去了，
 * hashset add 之前先判断要增加对象的hashcode；
 * 根据该值得到一个位置来存放当前的对象；
 * 当在该位置没有对象存在，集合set认为该对象在集合中不存在，直接增加进去；
 * 否则，接着把准备增加到集合中的对象与该位置的对象进行  equals比较，如果为false,那么集合中不存在该对象，
 * 再进行一次散列，将该对象放到散列后的计算出的新地址； 如果为 true,标识集合中已经存在该增加对象，不会再增加该对象到集合中；
 *
 * 当重写equal方法的时候，必须要重写hashcode方法
 * 如果一个类的两个对象使用 equals方法比较的时候结果为true; 那么，这两个对象必须具备相同的hashcode;
 *
 * hashmap key值不能重复；
 *
 * @author carter
 * create time    2018-08-20
 */
public class TestSet2 {


    public static void main(String[] args) {

        Set<User> userSet = new HashSet<>();

        userSet.add(new User(new String ("zhangsan")));
        userSet.add(new User(new String ("lisi")));
        userSet.add(new User(new String("zhangsan")));


        for (Iterator<User> iterator = userSet.iterator();iterator.hasNext();)
        {
            System.out.println(iterator.next().name);
        }

        System.out.println("==============");
        System.out.println(Integer.toHexString(new Object().hashCode()));
    }


}
class  User{

    String name;

    public User(String name) {
        this.name = name;
    }

    @Override
    public int hashCode() {
        return name.hashCode();
    }

    @Override
    public boolean equals(Object obj) {


         if(null == obj) {
             return true;
         }


         if (obj instanceof User)
         {
             User user  = (User) obj;
             return user.name.equals(this.name);
         }

         return false;

    }
}
